home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
-
- #include <stdio.h>
- #include <strings.h>
- #include "parse.h"
- #include <sys/types.h>
- #include <sys/stat.h>
-
- extern primitive *plist;
-
- static FILE *fpout;
-
- void printstate(primitive *p, reservedword ptype)
- {
- if (p->Color != 7) {
- switch (p->Color) {
- case -3:
- fprintf(fpout, ", .blink");
- break;
- case -2:
- fprintf(fpout, ", .smear");
- break;
- case -1:
- fprintf(fpout, ", .invisible");
- break;
- case 0:
- fprintf(fpout, ", .black");
- break;
- case 1:
- fprintf(fpout, ", .red");
- break;
- case 2:
- fprintf(fpout, ", .green");
- break;
- case 3:
- fprintf(fpout, ", .yellow");
- break;
- case 4:
- fprintf(fpout, ", .blue");
- break;
- case 5:
- fprintf(fpout, ", .magenta");
- break;
- case 6:
- fprintf(fpout, ", .cyan");
- break;
- default:
- fprintf(fpout, ", .c%d", p->Color);
- break;
- }
- }
- if (p->layers != 0xffffffff) {
- for (long i = 0; i < 16; i++) {
- if ((p->layers)&(1<<i))
- fprintf(fpout, ", .L%d", i);
- }
- }
- if (ptype == _vertex && ((vertex *)p)->type != _diamond) {
- switch (((vertex *)p)->type) {
- case _plus:
- fprintf(fpout, ", .plus");
- break;
- case _cross:
- fprintf(fpout, ", .cross");
- break;
- case _nomark:
- fprintf(fpout, ", .nomark");
- break;
- case _soliddiamond:
- fprintf(fpout, ", .soliddiamond");
- break;
- }
- }
- if (ptype == _line && ((line *)p)->type != _segment) {
- switch (((line *)p)->type) {
- case _longline:
- fprintf(fpout, ", .longline");
- break;
- case _ray12:
- fprintf(fpout, ", .ray12");
- break;
- }
- }
- if (p->name[0]) {
- fprintf(fpout, ", \"%s\"", p->name);
- }
- fprintf(fpout, ");\n");
- }
-
- void printvertex(vertex *v)
- {
- switch (v->c.type) {
- case VERTFREE:
- fprintf(fpout, "%s = .free(%g, %g", v->st->symbol,
- v->xw, v->yw);
- break;
- case VERTONLINE:
- fprintf(fpout, "%s = .vonl(%s, %g, %g", v->st->symbol,
- v->c.p1->st->symbol, v->xw, v->yw);
- break;
- case VERTONCIRCLE:
- fprintf(fpout, "%s = .vonc(%s, %g, %g", v->st->symbol,
- v->c.p1->st->symbol, v->xw, v->yw);
- break;
- case VERTLINELINE:
- fprintf(fpout, "%s = .v.ll(%s, %s", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTVERTVERTMID:
- fprintf(fpout, "%s = .v.vvmid(%s, %s", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTLINECIRC1:
- fprintf(fpout, "%s = .v.lc(%s, %s, 1", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTLINECIRC2:
- fprintf(fpout, "%s = .v.lc(%s, %s, 2", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTCIRCCIRC1:
- fprintf(fpout, "%s = .v.cc(%s, %s, 1", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTCIRCCIRC2:
- fprintf(fpout, "%s = .v.cc(%s, %s, 2", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTVERTVERTRATIO:
- fprintf(fpout, "%s = .v.vvratio(%s, %s, %s", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol,
- v->c.p3->st->symbol);
- break;
- case VERTANGLEVERTVERT:
- fprintf(fpout, "%s = .v.avv(%s, %s, %s", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol,
- v->c.p3->st->symbol);
- break;
- case VERTCIRCCENTER:
- fprintf(fpout, "%s = .v.ccenter(%s", v->st->symbol,
- v->c.p1->st->symbol);
- break;
- case VERTLINEVERTMIRROR:
- fprintf(fpout, "%s = .v.lvmirror(%s, %s", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTONCONIC:
- fprintf(fpout, "%s = .vonconic(%s, %g, %g", v->st->symbol,
- v->c.p1->st->symbol, v->xw, v->yw);
- break;
- case VERTCIRCVERTINV:
- fprintf(fpout, "%s = .v.vcinv(%s, %s", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTLINECONIC1:
- fprintf(fpout, "%s = .v.lconic(%s, %s, 1", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- case VERTLINECONIC2:
- fprintf(fpout, "%s = .v.lconic(%s, %s, 2", v->st->symbol,
- v->c.p1->st->symbol, v->c.p2->st->symbol);
- break;
- }
- printstate(v, _vertex);
- }
-
- void printline(line *l)
- {
- switch (l->c.type) {
- case LINEVERTVERT:
- fprintf(fpout, "%s = .l.vv(%s, %s", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINEVERTLINEPAR:
- fprintf(fpout, "%s = .l.vlpar(%s, %s", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINEVERTLINEPERP:
- fprintf(fpout, "%s = .l.vlperp(%s, %s", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINEVERTCIRC1:
- fprintf(fpout, "%s = .l.vc(%s, %s, 1", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINEVERTCIRC2:
- fprintf(fpout, "%s = .l.vc(%s, %s, 2", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINECIRCCIRCEXT1:
- fprintf(fpout, "%s = .l.ccext(%s, %s, 1", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINECIRCCIRCEXT2:
- fprintf(fpout, "%s = .l.ccext(%s, %s, 2", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINECIRCCIRCINT1:
- fprintf(fpout, "%s = .l.ccint(%s, %s, 1", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINECIRCCIRCINT2:
- fprintf(fpout, "%s = .l.ccint(%s, %s, 2", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINETANGENTCONIC1:
- fprintf(fpout, "%s = .l.conicv(%s, %s, 1", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- case LINETANGENTCONIC2:
- fprintf(fpout, "%s = .l.conicv(%s, %s, 2", l->st->symbol,
- l->c.p1->st->symbol, l->c.p2->st->symbol);
- break;
- }
- printstate(l, _line);
- }
-
- void printcircle(circle *c)
- {
- switch (c->c.type) {
- case CIRCVERTVERT:
- fprintf(fpout, "%s = .c.vv(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- case CIRCCIRCCIRCINV:
- fprintf(fpout, "%s = .c.ccinv(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- case CIRCLINECIRCINV:
- fprintf(fpout, "%s = .c.lcinv(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- case CIRCVERTVERTVERT:
- fprintf(fpout, "%s = .c.vvv(%s, %s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
- break;
- case CIRCLINELINELINE1:
- fprintf(fpout, "%s = .c.lll(%s, %s, %s, 1", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
- break;
- case CIRCLINELINELINE2:
- fprintf(fpout, "%s = .c.lll(%s, %s, %s, 2", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
- break;
- case CIRCLINELINELINE3:
- fprintf(fpout, "%s = .c.lll(%s, %s, %s, 3", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
- break;
- case CIRCLINELINELINE4:
- fprintf(fpout, "%s = .c.lll(%s, %s, %s, 4", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
- break;
- case CIRCVERTLEN:
- fprintf(fpout, "%s = .c.vlen(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- }
- printstate(c, _circle);
- }
-
- void printbezier(bezier *c)
- {
- switch (c->c.type) {
- case BEZVERTVERTVERTVERT:
- fprintf(fpout, "%s = .bez.vvvv(%s, %s, %s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol,
- c->c.p3->st->symbol, c->c.p4->st->symbol);
- break;
- }
- printstate(c, _bezier);
- }
-
- void printtext(text *c)
- {
- fprintf(fpout, ".text(\"%s\"", c->str);
- printstate(c, _text);
- }
-
- void printlength(length *c)
- {
- switch (c->c.type) {
- case LENVERTVERT:
- fprintf(fpout, "%s = .len.vv(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- case LENPLUSLENLEN:
- fprintf(fpout, "%s = .len.plus(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- case LENMINUSLENLEN:
- fprintf(fpout, "%s = .len.minus(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- case LENTIMESLENLEN:
- fprintf(fpout, "%s = .len.times(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- case LENDIVLENLEN:
- fprintf(fpout, "%s = .len.divide(%s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol);
- break;
- case LENFLOAT:
- fprintf(fpout, "%s = .len.f(%g", c->st->symbol,
- c->value);
- break;
- case LENANGLE:
- fprintf(fpout, "%s = .len.a(%s", c->st->symbol, c->st->symbol);
- break;
- case ANGLEVERTVERTVERT:
- fprintf(fpout, "%s = .a.vvv(%s, %s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol,
- c->c.p3->st->symbol);
- break;
- case RATIOVERTVERTVERT:
- fprintf(fpout, "%s = .ratio.vvv(%s, %s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol,
- c->c.p3->st->symbol);
- break;
- }
- printstate(c, _length);
- }
-
- void printconic(conic *c)
- {
- switch (c->c.type) {
- case CONICFIVEVERT:
- fprintf(fpout, "%s = .conic.vvvvv(%s, %s, %s, %s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol,
- c->c.p3->st->symbol, c->c.p4->st->symbol,
- c->c.p5->st->symbol);
- break;
- case CONICFIVELINE:
- fprintf(fpout, "%s = .conic.lllll(%s, %s, %s, %s, %s", c->st->symbol,
- c->c.p1->st->symbol, c->c.p2->st->symbol,
- c->c.p3->st->symbol, c->c.p4->st->symbol,
- c->c.p5->st->symbol);
- break;
- }
- printstate(c, _conic);
- }
- void printcomment(comment *c)
- {
- fprintf(fpout, "//%s", c->str);
- }
-
- void printprim(primitive *p)
- {
- switch (p->ptype) {
- case _vertex:
- printvertex((vertex *)p);
- break;
- case _line:
- printline((line *)p);
- break;
- case _circle:
- printcircle((circle *)p);
- break;
- case _bezier:
- printbezier((bezier *)p);
- break;
- case _length:
- printlength((length *)p);
- break;
- case _comment:
- printcomment((comment *)p);
- break;
- case _conic:
- printconic((conic *)p);
- break;
- case _text:
- printtext((text *)p);
- break;
- }
- }
-
- long printall(char *s)
- {
- mode_t omask = umask(0);
- fpout = fopen(s, "w");
- umask(omask);
- if (fpout == 0) {
- fprintf(stderr, "can't open %s\n", s);
- return 0;
- }
- fprintf(fpout, ".geometry \"version 0.1\";\n");
- for (primitive *p = plist; p; p = p->next)
- printprim(p);
- fclose(fpout);
- return 1;
- }
-